﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using System.Collections;
using System.Data.SqlClient;
using System.Data;
using CapaLogica.CL.UtilidadesGenerales;
using CapaLogica.CL.Bitacora;

namespace CapaLogica.CL.Tema
{
    public class TemaPersistente
    {
        internal TemaPersistente()
        {

        }

        private AcessoBD _acceso = new AcessoBD();

        /// <summary>
        /// Metodo de registrar tema en el objeto persistente
        /// </summary>
        /// <param name="pTema"></param>
        /// <param name="pidForo"></param>
        /// <param name="pidUsuario"></param>
        public void registrarTemaPersistente(Cl_Tema pTema, List<int> plistaIdEstudiantes, int pIdForo, 
                                               Boolean pConFecha, int pIdUsuario)
        {

            SqlConnection conexion = _acceso.GetConnection();
            conexion.Open();
            SqlTransaction transaction = conexion.BeginTransaction(IsolationLevel.ReadCommitted);

            try
            {
                Parametros[] parametros = new Parametros[7];
                string sql = @"insert into dbo.T_Tema(nombre, descripcion, id_foro,  fecha_cierre, calificacion, justificacion, canMaxAportes)
                                values(param1, param2, param3, param4, param5, param6, param7) ";

                parametros[0] = new Parametros(pTema.Nombre, "param1");
                parametros[1] = new Parametros(pTema.Descripcion, "param2");
                parametros[2] = new Parametros(pIdForo, "param3");

                if (pConFecha == false  )
                {
                    parametros[3] = new Parametros(DBNull.Value  , "param4"); 
                }
                else
                {
                    parametros[3] = new Parametros(pTema.FechaFinal, "param4");
                }

                            
                parametros[4] = new Parametros(pTema.Calificacion, "param5");

                parametros[5] = new Parametros(pTema.Justificacion, "param6");

                parametros[6] = new Parametros(pTema.CantMaxAportes , "param7");

                //registro del tema
                pTema.IdTema = _acceso.executeSQLInsertTransation(transaction, sql, parametros);

                //registro bitacora de la creación del tema
                Modulo.insertarBitacoraParaTransaccion(transaction, pIdUsuario, "Creación de un nuevo Tema", pTema.IdTema, 8, 1);

                int idRelacion = 0;
                Parametros[] parametrosGP = new Parametros[2];

                for (int i = 0; i < plistaIdEstudiantes.Count; i++)
                {
                    sql = @"insert into dbo.T_Tema_Estudiante (id_estudiante, id_tema)
                            values (param1, param2) ";

                    parametrosGP[0] = new Parametros(plistaIdEstudiantes[i], "param1");
                    parametrosGP[1] = new Parametros(pTema.IdTema, "param2");
                    idRelacion = _acceso.executeSQLInsertTransation(transaction, sql, parametrosGP);


                    Modulo.insertarBitacoraParaTransaccion(transaction, pIdUsuario, "Creación de la relación entre un Estudiante y un tema.", idRelacion, 16, 1);

                }

                transaction.Commit();
                conexion.Close();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw ex;

            }
            finally
            {
                conexion.Close();
            }
        }
        



        /// <summary>
        /// Metodo que busca todos los temas de un foro.
        /// </summary>
        /// <param name="pIdForo">Id del foro, tipo int</param>
        /// <remarks></remarks>
        public List<EsTema> buscarTemasDeUnForo(int pIdForo)
        {
            string psp = @"dbo.sp_buscar_temas_de_foro";          
            List<EsTema> temas = new List<EsTema>();
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdForo, "idForo");
            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);
                DateTime fechaInicio;
                DateTime fechaFin;
                string justificacion = "";
              

                while (reader.Read())
                {

                    fechaInicio = DateTime.MinValue;
                     fechaFin = DateTime.MinValue;

                    if (!reader.IsDBNull(4))
                    {
                        fechaInicio = reader.GetDateTime(4);
                    }

                    if (!reader.IsDBNull(5))
                    {
                        fechaFin  = reader.GetDateTime(5);
                    }

                    if (!reader.IsDBNull(7))
                    {
                        justificacion  = reader.GetString(7);
                    }

                    
                    EsTema tema = new EsTema(reader.GetInt32(0)+"", reader.GetString(1)+"", reader.GetString(2), reader.GetBoolean(3),  fechaInicio.ToShortDateString(), 
                                        fechaFin.ToShortDateString(), reader.GetBoolean(6), justificacion, reader.GetInt32(8)+"", reader.GetInt32(9)+"");


                    temas.Add(tema);
                }

                reader.Close();
                return temas;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
            /// <summary>
        /// Método de la clase encargada de buscar un nuevo curso a la DB 
        /// </summary>
        /// <param name="pcriterio"></param>
        /// <remarks></remarks>
        /// <return>
        /// Retorna una lista generica de tipo curso
        /// </return>
        internal  List<Cl_Tema> buscarTemaPorForo(int pidForo)
        {
            SqlDataReader _drTema;


            String _sp = "dbo.sp_buscar_temas_foro";

            List<Cl_Tema> _listaGenerica = new List<Cl_Tema>();

            Parametros[] _params = new Parametros[1];

            _params[0] = new Parametros(pidForo, "idforo");

            try
            {
                _drTema = _acceso.execute_SP_Consulta(_sp, _params);

                while (_drTema.Read())
                {
                    //tema= new Cl_Tema();
                    //tema.IdTema = reader.GetInt32(0);
                    //tema.Nombre = reader.GetValue(1).ToString();
                    //tema.Descripcion = reader.GetValue(2).ToString();
                    //tema.IdForo = reader.GetInt32(3);
                    //tema.FechaInicio = reader.GetDateTime(4);
                    //tema.FechaFinal = reader.GetDateTime(5);
                    //tema.Calificacion = reader.GetBoolean(6);
                    //tema.CantMaxAportes = reader.GetInt32(7);
                    //tema.Justificacion = reader.GetValue(8).ToString();
                    _listaGenerica.Add(new Cl_Tema(_drTema.GetInt32(0), _drTema.GetString(1), _drTema.GetString(2), _drTema.GetInt32(3), _drTema.GetDateTime(4), _drTema.GetDateTime(5), _drTema.GetBoolean(6), _drTema.GetString(7), _drTema.GetInt32(8)));
                    //_listaGenerica.Add(tema);
                }

                //retornar el resultado
                return _listaGenerica;
            }
            catch (Exception ex)
            {
                throw new Exception("Error al Buscar Temas... " + ex.Message);
            }
        }

        /// Método de la clase encargada de buscar un nuevo curso a la DB 
        /// </summary>
        /// <param name="pcriterio"></param>
        /// <remarks></remarks>
        /// <return>
        /// Retorna una lista generica de tipo curso
        /// </return>
        internal List<Cl_Tema> buscarTodosTema()
        {
            SqlDataReader _drTema;

            int id = 1;

            String _sp = "sp_buscar_todos_temas";

            List<Cl_Tema> _listaGenerica = new List<Cl_Tema>();

            Parametros[] _params = new Parametros[1];

            _params[0] = new Parametros(id, "id");

            try
            {
                _drTema = _acceso.execute_SP_Consulta(_sp, _params);

                while (_drTema.Read())
                {
                    _listaGenerica.Add(new Cl_Tema(_drTema.GetInt32(0), _drTema.GetString(1), _drTema.GetString(2), _drTema.GetInt32(3), _drTema.GetDateTime(4), _drTema.GetDateTime(5), _drTema.GetBoolean(6), _drTema.GetString(7), _drTema.GetInt32(8)));
                }

                //retornar el resultado
                return _listaGenerica;
            }
            catch (Exception ex)
            {
                throw new Exception("Error al Buscar Temas... " + ex.Message);
            }
        }

        /// Método de la clase encargada de buscar un nuevo curso a la DB 
        /// </summary>
        /// <param name="pcriterio"></param>
        /// <remarks></remarks>
        /// <return>
        /// Retorna una lista generica de tipo curso
        /// </return>
        internal List<Cl_Tema> buscarTemaPorNombre(String pcriterio)
        {
            SqlDataReader _drTema;

            String _sp = "dbo.sp_buscar_temas_nombre";

            List<Cl_Tema> _listaGenerica = new List<Cl_Tema>();

            Parametros[] _params = new Parametros[1];

            _params[0] = new Parametros(pcriterio, "nombre");

            try
            {
                _drTema = _acceso.execute_SP_Consulta(_sp, _params);

                while (_drTema.Read())
                {
                    _listaGenerica.Add(new Cl_Tema(_drTema.GetInt32(0), _drTema.GetString(1), _drTema.GetString(2), _drTema.GetInt32(3), _drTema.GetDateTime(4), _drTema.GetDateTime(5), _drTema.GetBoolean(6), _drTema.GetString(7), _drTema.GetInt32(8)));
                
                }

                //retornar el resultado
                return _listaGenerica;
            }
            catch (Exception ex)
            {
                throw new Exception("Error al Buscar Temas... " + ex.Message);
            }
        }

        /// Método de la clase encargada de buscar un nuevo curso a la DB 
        /// </summary>
        /// <param name="pcriterio"></param>
        /// <remarks></remarks>
        /// <return>
        /// Retorna una lista generica de tipo curso
        /// </return>
        internal List<Cl_Tema> buscarTemaPorCantAporte(int pcriterio)
        {
            SqlDataReader _drTema;

            String _sp = "sp_buscar_temas_cant_aporte";

            List<Cl_Tema> _listaGenerica = new List<Cl_Tema>();

            Parametros[] _params = new Parametros[1];

            _params[0] = new Parametros(pcriterio, "cantidad_aportes");

            try
            {
                _drTema = _acceso.execute_SP_Consulta(_sp, _params);

                while (_drTema.Read())
                {
                    _listaGenerica.Add(new Cl_Tema(_drTema.GetInt32(0), _drTema.GetString(1), _drTema.GetString(2), _drTema.GetInt32(3), _drTema.GetDateTime(4), _drTema.GetDateTime(5), _drTema.GetBoolean(6), _drTema.GetString(7)));
                
                }

                //retornar el resultado
                return _listaGenerica;
            }
            catch (Exception ex)
            {
                throw new Exception("Error al Buscar Temas... " + ex.Message);
            }
        }

        /// Método de la clase encargada de buscar un nuevo curso a la DB 
        /// </summary>
        /// <param name="pcriterio"></param>
        /// <remarks></remarks>
        /// <return>
        /// Retorna una lista generica de tipo curso
        /// </return>
        internal List<Cl_Tema> buscarTemaCalificacion()
        {
            SqlDataReader _drTema;
            int ca = 1;

            String _sp = "sp_buscar_temas_calificacion";

            List<Cl_Tema> _listaGenerica = new List<Cl_Tema>();

            Parametros[] _params = new Parametros[1];

            _params[0] = new Parametros(ca, "id_tema");

            try
            {
                _drTema = _acceso.execute_SP_Consulta(_sp, _params);

                while (_drTema.Read())
                {
                    _listaGenerica.Add(new Cl_Tema(_drTema.GetInt32(0), _drTema.GetString(1), _drTema.GetString(2), _drTema.GetInt32(3), _drTema.GetDateTime(4), _drTema.GetDateTime(5), _drTema.GetBoolean(6), _drTema.GetString(7)));
                
                }

                //retornar el resultado
                return _listaGenerica;
            }
            catch (Exception ex)
            {
                throw new Exception("Error al Buscar Temas... " + ex.Message);
            }
        }

        /// Método de la clase encargada de buscar un nuevo curso a la DB 
        /// </summary>
        /// <param name="pcriterio"></param>
        /// <remarks></remarks>
        /// <return>
        /// Retorna una lista generica de tipo curso
        /// </return>
        internal List<Cl_Tema> buscarTemaSinCalificacion()
        {
            SqlDataReader _drTema;
            int ca = 1;

            String _sp = "sp_buscar_temas_sin_calificacion";

            List<Cl_Tema> _listaGenerica = new List<Cl_Tema>();

            Parametros[] _params = new Parametros[1];

            _params[0] = new Parametros(ca, "id_tema");

            try
            {
                _drTema = _acceso.execute_SP_Consulta(_sp, _params);

                while (_drTema.Read())
                {
                    _listaGenerica.Add(new Cl_Tema(_drTema.GetInt32(0), _drTema.GetString(1), _drTema.GetString(2), _drTema.GetInt32(3), _drTema.GetDateTime(4), _drTema.GetDateTime(5), _drTema.GetBoolean(6), _drTema.GetString(7)));
                
                }

                //retornar el resultado
                return _listaGenerica;
            }
            catch (Exception ex)
            {
                throw new Exception("Error al Buscar Temas... " + ex.Message);
            }
        }



        public int cantidadDeAportesDeUnEstudianteEnTema(int pIdEstudiante, int pIdTema)
        {
            string psp = @"sp_cantidad_de_aportes_de_un_estudiante";
            Parametros[] parametros = new Parametros[2];
            parametros[0] = new Parametros(pIdEstudiante, "idEstudiante");
            parametros[1] = new Parametros(pIdTema, "idTema");
            int cantidadAportes = 0;

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);

                if (reader.Read())
                {

                    cantidadAportes = reader.GetInt32(0);
                }

                reader.Close();
                return cantidadAportes;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }


        public int cantidadDeAportes(int pidTema)
        {
            string psp = @"sp_cant_aportes";
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pidTema, "idTema");
            int cantidad = 0;
            try
            {
                SqlDataReader reader = (SqlDataReader)_acceso.execute_SP_Consulta(psp, parametros);
           
                if (reader.Read())
                {
                    cantidad = reader.GetInt32(0);       
                }

                reader.Close();
                return cantidad;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<EsTema> buscarEstudiantesAsociadosTema(int pid)
        {
            string psp = @"dbo.sp_listar_estudiantes_tema";
            List<EsTema> temas = new List<EsTema>();

            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pid, "id_tema");

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    EsTema temp = new EsTema(reader.GetInt32(0)+"", reader.GetString(1));
                                                                        
                    temas.Add(temp);
                }

                reader.Close();
                return temas;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        internal List<EsTema> listarEstudiantesSinAsociar(int pidTema)
        {
            string psp = @"dbo.sp_listar_estudiantes_sin_tema_grupo";
           
            List<EsTema> temas = new List<EsTema>();

            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pidTema, "id_tema");

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);

                while (reader.Read())
                {
                    EsTema temp = new EsTema(reader.GetInt32(0) + "", reader.GetString(1));

                    temas.Add(temp);
                }

                reader.Close();
                return temas;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        public void cerrarTema(int pIdTema, int pIdusuario)
        {
            try
            {
                String sql = @"update dbo.T_Tema 
					            set abierto = 0
					            where id_tema = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pIdTema, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pIdusuario, "Cierre de tema", pIdTema, 8, 3);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


        public void eliminarTema(int pIdTema, int pIdusuario)
        {
            try
            {
                String sql = @"delete dbo.T_Tema 
					            where id_tema = param1";

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pIdTema, "param1");

                _acceso.executeSQL(sql, parametros);

                Modulo.insertarBitacora(pIdusuario, "Eliminación de Tema", pIdTema, 8, 2);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Método de la clase que busca los ids de las carreras de un estudiante.
        /// </summary>
        /// <param name="pIdGrupo">In del grupo, tipo int</param>
        /// <remarks></remarks>
        internal List<int> buscarIdsEstudiantesTema(int pid)
        {

            string psp = @"dbo.sp_listar_estudiantes_tema";
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pid, "id_tema");

            try
            {
                SqlDataReader reader = (SqlDataReader)_acceso.execute_SP_Consulta(psp, parametros);
                List<int> ids = new List<int>();
                while (reader.Read())
                {
                    ids.Add(reader.GetInt32(0));
                }

                reader.Close();
                return ids;

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        internal void actualizarTema(Cl_Tema pobjTema, List<int> listaEstudiantesA, List<int> pIdsBD, int pid,int pidUsuario)
        {

            try
            {

                Parametros[] parametros = new Parametros[9];

                string sql = "update dbo.T_Tema set nombre = param1, descripcion = param2, "+
                             "id_foro = param3, fecha_creacion = param4, fecha_cierre = param5," +
                             "calificacion = param6, justificacion = param7, canMaxAportes = param8 " +
                             "where id_tema = param0 ";

                parametros[0] = new Parametros(pid, "param0");
                parametros[1] = new Parametros(pobjTema.Nombre, "param1");
                parametros[2] = new Parametros(pobjTema.Descripcion , "param2");
                parametros[3] = new Parametros(pobjTema.IdForo, "param3");
                parametros[4] = new Parametros(pobjTema.FechaInicio, "param4");
                parametros[5] = new Parametros(pobjTema.FechaFinal, "param5");
                parametros[6] = new Parametros(pobjTema.Calificacion, "param6");
                parametros[7] = new Parametros(pobjTema.Justificacion, "param7");
                parametros[8] = new Parametros(pobjTema.CantAportes, "param8");
                
                
                _acceso.executeSQL(sql, parametros);

                try
                {
                    string sqlUpdate = @"delete from dbo.T_Tema_Estudiante where id_tema = param1 and
                                        id_estudiante = param2";


                    string sqlInsert = @"insert into dbo.T_Tema_Estudiante(id_tema,id_estudiante) 
                                        values(param1, param2)";

                    EsBitacora bitacora = new EsBitacora();
                    bitacora.IdUsuario = pidUsuario;
                    bitacora.Descripcion = "Modificacion Tema";
                    bitacora.Tipo = "8";


                    Parametros[] paramUpdate = new Parametros[2];
                    paramUpdate[0] = new Parametros(pid, "param1");
                    paramUpdate[1] = new Parametros("", "param2");


                    Parametros[] paramInsert = new Parametros[2];
                    paramInsert[0] = new Parametros(pid, "param1");
                    paramInsert[1] = new Parametros("", "param2");

                    Modulo.comparaListas(listaEstudiantesA, pIdsBD, sqlUpdate, sqlInsert, paramUpdate, paramInsert, bitacora, null);
                }
                catch (Exception ex)
                {
                    throw ex;
                }


            }
            catch (Exception)
            {
       
               throw new Exception("Hubo un error al intentar modificar el tema. El tema no ha sido modificada.");

            }
            
    }



        internal void modificarTema(int pid, String pnombre, String pdescripcion, DateTime pfechaFin,
                                            Boolean psiCalificacion, String pjustificacion, int pcantMaxAportes, List<int> listaEstudiantesA, int pIdusuario, Boolean pconFecha)
        {

            try
            {

                Parametros[] parametros = new Parametros[6];

                string sql = "update dbo.T_Tema set nombre = param1, descripcion = param2, " +
                             "calificacion = param3, justificacion = param4, canMaxAportes = param5 " +
                             "where id_tema = param6 ";

 
                parametros[0] = new Parametros(pnombre, "param1");
                parametros[1] = new Parametros(pdescripcion , "param2");
                parametros[2] = new Parametros(psiCalificacion , "param3");
                parametros[3] = new Parametros(pjustificacion, "param4");
                parametros[4] = new Parametros(pcantMaxAportes , "param5");
                parametros[5] = new Parametros(pid, "param6");

                _acceso.executeSQL(sql, parametros);

                Parametros[] paramFecha = new Parametros[2];
                if (pconFecha == true)
                {
                 
                    sql = @"update dbo.T_Tema set fecha_cierre=param1 
                            where id_tema = param2";

                    paramFecha[0] = new Parametros(pfechaFin, "param1");
                    paramFecha[1] = new Parametros(pid, "param2");

                    _acceso.executeSQL(sql, paramFecha);
                }
                else
                {
                    sql = @"update dbo.T_Tema set fecha_cierre=param1
                            where id_tema = param2";

                    paramFecha[0] = new Parametros(DBNull.Value , "param1");
                    paramFecha[1] = new Parametros(pid, "param2");

                    _acceso.executeSQL(sql, paramFecha);

                }

                

                try
                {
                    string sqlUpdate = @"delete from dbo.T_Tema_Estudiante where id_tema = param1 and
                                        id_estudiante = param2";


                    string sqlInsert = @"insert into dbo.T_Tema_Estudiante(id_tema,id_estudiante) 
                                        values(param1, param2)";

                    EsBitacora bitacora = new EsBitacora();
                    bitacora.IdUsuario = pIdusuario;
                    bitacora.Descripcion = "Modificacion Tema";
                    bitacora.Tipo = "8";


                    Parametros[] paramUpdate = new Parametros[2];
                    paramUpdate[0] = new Parametros(pid, "param1");
                    paramUpdate[1] = new Parametros("", "param2");


                    Parametros[] paramInsert = new Parametros[2];
                    paramInsert[0] = new Parametros(pid, "param1");
                    paramInsert[1] = new Parametros("", "param2");

                    Modulo.comparaListas(listaEstudiantesA, buscarIdsEstudiantesTema(pid), sqlUpdate, sqlInsert, paramUpdate, paramInsert, bitacora, null);
                }
                catch (Exception ex)
                {
                    throw ex;
                }


            }
            catch (Exception ex)
            {

                throw ex;

            }

        }


        /// <summary>
        /// Método de la clase encargada de insertar una nueva Carrera a la BD
        /// </summary>
        /// <param name="pGrupo">Objeto carrera, tipo Carrera</param>
        /// <param name="pUsuario">Usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        internal void eliminarTema2(int pidTema, int pIdUsuario)//parametros del grupo
        {

            Parametros[] parametros = new Parametros[1];
            String sql = @"Delete dbo.T_Tema where dbo.T_Tema.id_tema = param1";

            parametros[0] = new Parametros(pidTema, "param1");

            try
            {

                _acceso.executeSQL(sql, parametros);
                //BITACORA
                Modulo.insertarBitacora(pIdUsuario, "Eliminacion de un tema", 2, 3, 2);
                //---------------

            }
            catch (Exception ex)
            {
                SqlException exsql = ex as SqlException;
                SqlError er = exsql.Errors[0];

                if (er.Number == 547)
                {
                    throw new Exception("Esta carrera esta asociada a otras entidades asi que no se puede borrar");
                }
                else
                {
                    throw new Exception("Ha habido un error al eliminar la carrera. " + er.Number);
                }
            }

        }



        public Cl_Tema buscarTema(int pIdTema)
        {
            string psp = @"dbo.sp_buscar_Tema_por_id";

            Cl_Tema tema = null;
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdTema, "idTema");
            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta (psp, parametros);
                DateTime fechaInicio;
                DateTime fechaFin;
                string justificacion = null;

                while (reader.Read())
                {

                    fechaInicio = DateTime.MinValue;
                    fechaFin = DateTime.MinValue;

                    if (!reader.IsDBNull(4))
                    {
                        fechaInicio = reader.GetDateTime(4);
                    }

                    if (!reader.IsDBNull(5))
                    {
                        fechaFin = reader.GetDateTime(5);
                    }

                    if (!reader.IsDBNull(7))
                    {
                        justificacion = reader.GetString(7);
                    }
                   //  abierto, fecha_creacion, 
                         //           fecha_cierre, calificacion, justificacion, canMaxAportes

                    tema = new Cl_Tema();
                    tema.IdTema  = reader.GetInt32 (0);
                    tema.Nombre = reader.GetString(1);
                    tema.Descripcion = reader.GetString(2);
                    tema.Abierto = reader.GetBoolean(3);
                    tema.FechaInicio = fechaInicio;
                    tema.FechaFinal = fechaFin;
                    tema.Calificacion = reader.GetBoolean(6);
                    tema.Justificacion = justificacion;
                    tema.CantMaxAportes = reader.GetInt32(8);
                    tema.IdDuenioForo = reader.GetInt32(9);
                }

                reader.Close();
                return tema;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }




        /// <summary>
        /// Metodo que busca todos los temas de un foro.
        /// </summary>
        /// <param name="pIdForo">Id del foro, tipo int</param>
        /// <remarks></remarks>
        public List<EsTema> buscarTemasDeForosDeEstudiante(int pIdForo, int pIdEstudiante)
        {
            string psp = @"dbo.sp_listar_temas_foros_estudiante";
         
            List<EsTema> temas = new List<EsTema>();
            Parametros[] parametros = new Parametros[2];
            parametros[0] = new Parametros(pIdForo, "id_foro");
            parametros[1] = new Parametros(pIdEstudiante, "idEstudiante");
            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);
                DateTime fechaInicio;
                DateTime fechaFin;
                string justificacion = null;
                

                while (reader.Read())
                {

                    fechaInicio = DateTime.MinValue;
                    fechaFin = DateTime.MinValue;

                    if (!reader.IsDBNull(4))
                    {
                        fechaInicio = reader.GetDateTime(4);
                    }

                    if (!reader.IsDBNull(5))
                    {
                        fechaFin = reader.GetDateTime(5);
                    }

                    if (!reader.IsDBNull(7))
                    {
                        justificacion = reader.GetString(7);
                    }





                    EsTema tema = new EsTema(reader.GetInt32(0) + "", reader.GetString(1) + "", reader.GetString(2), reader.GetBoolean(3), fechaInicio.ToShortDateString(),
                                        fechaFin.ToShortDateString(), reader.GetBoolean(6), reader.GetString(7), reader.GetInt32(8)+"", reader.GetInt32(9)+"");


                    temas.Add(tema);
                }

                reader.Close();
                return temas;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
  }
}
